/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package redeneural;


import java.io.File;
import java.io.FileReader;
import javax.swing.JOptionPane;
import weka.classifiers.functions.MultilayerPerceptron;
import weka.core.Instance;
import weka.core.Instances;

/**
 *
 * @author Bruno Vicente
 */
public class Treinamento {

    private Instances instancia;
    private MultilayerPerceptron RedeNeural;
    private String camada;
    private Double taxa = -1.0;
    private Double erro = -1.0;
    private int epocas = -1;
    private File arquivo;

    public Treinamento(File arquivo,double taxa,double erro,int epoca,String camada){
        this.camada = camada;
        this.taxa = taxa;
        this.erro = erro;
        this.epocas = epoca;
        this.arquivo = arquivo;
        //Cria-se a rede neural
        RedeNeural = new MultilayerPerceptron();
    }

    public int Treinar() throws Exception{


        if(this.camada.isEmpty() || this.epocas<0 || this.erro < 0 || this.taxa < 0)
            throw new Exception("Preencha todos os dados da Rede Neural!");

        FileReader reader = new FileReader(String.valueOf(arquivo));
        instancia = new Instances(reader);
        instancia.setClassIndex(instancia.numAttributes() - 1);

        //CONSTRUÇÃO DA REDE NEURAL
        RedeNeural.setAutoBuild(true);
        //ATRIBUIÇÃO DA TAXA DE APRENDIZAGEM
        RedeNeural.setLearningRate(this.taxa);
        //ATRIBUIÇÃO DO ERRO
        RedeNeural.setMomentum(this.erro);
        //ATRIBUIÇÃO DAS ITERAÇÕES
        RedeNeural.setTrainingTime(this.epocas);
        //ATRIBUIÇÃO DO NUMERO DE CAMADAS OCULTAS DA REDE
        RedeNeural.setHiddenLayers(this.camada);

        //TREINAMENTO DA REDE NEURAL
        RedeNeural.buildClassifier(instancia);

        int correta = 0;
        for (int i = 0; i < instancia.numInstances(); i++) {
            Instance instancias = instancia.instance(i);
            int inst = (int) (RedeNeural.classifyInstance(instancias));

            if (inst == (int) instancias.classValue()) {
                correta++;
                }
        }

        return correta;
    }//FIM DO TREINAMENTO

    public MultilayerPerceptron getRedeNeural() {
        return RedeNeural;
    }

    public String getCamada() {
        return camada;
    }

    public int getEpocas() {
        return epocas;
    }

    public Double getErro() {
        return erro;
    }

    public Double getTaxa() {
        return taxa;
    }

    public Instances getInstancia() {
        return instancia;
    }

}//FIM DA CLASSE
